package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
)

func readByLine(i *os.File) {
	// 创建一个流
	reader := bufio.NewReader(i)
	// 读取操作 死循环
	for {
		//读取到一个换行就结束
		str, err := reader.ReadString('\n')
		if err == io.EOF { //io.EOF 表示已经读取到文件的结尾
			break
		}
		//如果没有读取到文件结尾的话，就正常输出文件内容即可：
		fmt.Print(str)
	}
	//结束：
	fmt.Println("文件读取成功，并且全部读取完毕")
}

func main() {

	// 读取文件
	file, err := os.Open(`D:/person/满江红.txt`)
	if err != nil {
		fmt.Println("文件打开失败")
	}
	fmt.Printf("文件=%v \n", file)

	//按照行读取数据
	fmt.Println("按照行读取数据============================================")
	readByLine(file)

	// 关闭文件
	err1 := file.Close()
	if err1 != nil {
		fmt.Println("文件关闭失败")
	}

	//读取整个文件
	fmt.Println("读取整个文件============================================")
	readByFile()

	//写入文件
	fmt.Println("写入文件============================================")
	writerFile()
}

func writerFile() {
	//写入文件操作：
	//打开文件：
	file, err := os.OpenFile("D:/person/满江红.txt", os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
	if err != nil {
		fmt.Printf("打开文件失败", err)
		return
	}

	//及时将文件关闭：
	defer file.Close()

	//写入文件操作：---》IO流---》缓冲输出流(带缓冲区)
	writer := bufio.NewWriter(file)
	for i := 0; i < 1; i++ {
		writer.WriteString("\n您好\n")
	}

	//流带缓冲区，刷新数据--->真正写入文件中：
	writer.Flush()
	//0666 所有用户可读可写  -rw-rw-rw-
	s := os.FileMode(0666).String()
	fmt.Println(s)
}

func readByFile() {
	//在下面的程序中不需要进行 Open\Close操作，因为文件的打开和关闭操作被封装在ReadFile函数内部了
	content, _ := ioutil.ReadFile("D:/person/满江红.txt")
	fmt.Printf("%v \n", string(content))
}
